VisualHMI - 关于LUA

本章节主要介绍Lua的特性,以及开发过程的相关建议

1. 如何新建 main.lua

在菜单工程栏→脚本编程,打开脚本编程工具后,默认会自动部分代码,并且在工程目录下默认生成main.lua文件,以Modbus 为例,如下所示

Video_2023-12-29_100923

自动生成的main.lua含以下3部分

1.1.加密

当设置 ENCRYPT =1时,编译生成private下载资源包,当前*.lua文件将进行加密。实体屏上电时,将会解密在运行

_ENCRYPT_=0    --LUA脚本加密

Video_2023-12-30_102709

1.2.数据类型声明

以Modbus协议为例,默认生成的main.lua,自动声明数据类型如下所示:

--数据类型定义
VT_LW = 1    --变量地址
VT_RW = 2    --FLASH存储
VT_0x = 10    --线圈
VT_1x = 11    --输入点
VT_3x = 12    --输入寄存器
VT_4x = 13    --保持寄存器

若协议为Fx2N,自动声明数据类型如下所示:

--数据类型定义
VT_LW = 1    --变量地址
VT_RW = 2    --FLASH存储
VT_X = 10    --输入位
VT_Y = 11    --输出位
VT_S = 12    --状态位
VT_M = 13    --辅助位
VT_D = 14    --数据
VT_T = 15    --定时器值(字)
VT_C = 16    --16位计数器值
VT_CX = 17    --32位计数器值

1.3.系统回调函数

默认生成的main.lua,自动添加常见的系统回调函数,若项目中用到其他系统回调函数,可参考ViusalHMI - LUA API(点击跳转)

function on_init()
end

function on_run(screen)
end

function on_update(slave,vtype,addr)
end

function on_draw(screen_id,control_id)
end

2. 如何编辑LUA

编辑Lua文件,除了用ViusalHMI上位机自带的编辑器,可以使用第三方软件编写,如NotePad++、Lua editor、Vs Code等等

编辑程序取决于用户习惯,选择对应的编辑软件即可

重点

注意!!!

多个编辑软件打开同一个项目的LUA程序,编辑软件可能会自动保存,导致代码不同步、文件编码(UTF8/GB23120)异常

2.1. NotePad++

用NotePad++ 软件打开编辑,如下所示:

image-20231229111118129

2.2. Lua editor

用Lua editor 软件打开编辑,如下所示:

image-20231229111257720

2.3. Vs Code

用Vs Code 软件打开编辑,如下所示:

image-20231229111426935

3.如何查错

Lua属于解释性语言,编写的逻辑代码只有在程序运行的过程才会发现逻辑错误,即可以通过虚拟屏、运行相关业务逻辑查看是否有BUG,不支持断点调试

如下所示一段代码

function on_update(slave,vtype,addr)
    if vtype == VT_LW
    then
        if addr == 0x1001
        then
            local val = get_uint16(vtype,addr)
            mb_write_reg_06(1, 0x0000, val)
        end
    end
end

3.1.虚拟屏调试

运行虚拟屏,点击修改寄存器0x1001,虚拟屏的设置窗口,显示错误,如下所示

Video_2023-12-29_112217

如下所示:在[ ENCRYPT =0 --LUA脚本加密...]开头的文件lua文件的78行,出现一个错误信息,mb_write_reg_06为nil值,找不到变量/函数, 即可从该行的上下文、逻辑等排查异常

DBG [string "_ENCRYPT_=0    --LUA脚本加密..."]:78: attempt to call a nil value (global 'mb_write_reg_06')

重点

常见LUA异常:

1.空值:nil,attempt to call a nil value。常见变量未定义、函数未定义、空表等

2.类型:number expected, got string(希望是数值,但是当前参数为字符串),如 bad argument #3 to 'set_uint16',number expected, got string

3.重启:定义的表格过大内存溢出、循环体过大开门狗复位

3.2.实体屏调试

屏幕一般有一路TTL电平调试串口信息输出。以HMI80480M070硬件为例,PCB上有1个2.54间距的排针,丝印一般为J2,方孔+圆孔组成。其中,方孔为GND,圆孔为屏幕TX

电阻核心硬件

重点

串口配置:

1.USB转TTL

2.115200波特率,8N1

3.ASSIC显示

4.个别型号或定制的硬件,是多路串口,其中本调试串口将被作为第2路串口使用,固不支持调试信息输出

实体屏错误信息(举例),如下所示:

image-20231229134153694

4. 如何分模块

若功能比较复杂,代码量比较大,建议分多Lua文件模块,编辑管理

  • 在工程目录下,新建*.lua文件,如下所示

image-20231229134801481

  • 在初始化on_dofile('*.lua')文件,如下所示
--初始化函数
function on_init()

    dofile('wbrCom.lua')
    dofile('dp.lua')
    dofile('gui.lua')
    dofile('ota.lua')
    dofile('file.lua')
    dofile('wbrCfg.lua')

    set_string(VT_LW, regAddr.mcu_ver, 'V'..ProductKey.v)
    uart_setup(1, 115200, 8, 0, 0)
end

image-20231229135315284

Copyright ©Dacai all right reserved,powered by Gitbook该文件修订时间: 2024-01-19 10:12:42

results matching ""

    No results matching ""